Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


RNS/Interfaces/Interface.py b051e76d00ab97baa948e69cdacadba3cf4739da (b051e76d) Text, 16.01 KB

T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787RNS
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj

Tff7b72class T56d364InterfaceTb4b4b4:
Te6edf3IN Tff7b72= Tff7b72False
Te6edf3OUT Tff7b72= Tff7b72False
Te6edf3FWD Tff7b72= Tff7b72False
Te6edf3RPT Tff7b72= Tff7b72False
Te6edf3name Tff7b72= Tff7b72None

T8b949e# Interface mode definitions
Te6edf3MODE_FULL Tff7b72= T79c0ff0x01
Te6edf3MODE_POINT_TO_POINT Tff7b72= T79c0ff0x02
Te6edf3MODE_ACCESS_POINT Tff7b72= T79c0ff0x03
Te6edf3MODE_ROAMING Tff7b72= T79c0ff0x04
Te6edf3MODE_BOUNDARY Tff7b72= T79c0ff0x05
Te6edf3MODE_GATEWAY Tff7b72= T79c0ff0x06
Te6edf3MODE_INTERNAL Tff7b72= T79c0ff0x07

T8b949e# Which interface modes a Transport Node should
T8b949e# actively discover paths for.
Te6edf3DISCOVER_PATHS_FOR Tff7b72= Tb4b4b4[Te6edf3MODE_ACCESS_POINTTb4b4b4, Te6edf3MODE_GATEWAYTb4b4b4, Te6edf3MODE_ROAMINGTb4b4b4, Te6edf3MODE_INTERNALTb4b4b4]
Te6edf3BOUNDARY_SEARCH_MODES Tff7b72= Tb4b4b4[Te6edf3MODE_BOUNDARYTb4b4b4, Te6edf3MODE_GATEWAYTb4b4b4]

T8b949e# How many samples to use for announce
T8b949e# frequency calculations
Te6edf3IA_FREQ_SAMPLES Tff7b72= T79c0ff48
Te6edf3OA_FREQ_SAMPLES Tff7b72= T79c0ff48
Te6edf3IP_FREQ_SAMPLES Tff7b72= T79c0ff48
Te6edf3OP_FREQ_SAMPLES Tff7b72= T79c0ff48

Te6edf3AR_MINFREQ_HZ Tff7b72= T79c0ff0.1
Te6edf3PR_MINFREQ_HZ Tff7b72= T79c0ff0.1
Te6edf3AR_FREQ_DECAY Tff7b72= T79c0ff1Tff7b72/Te6edf3AR_MINFREQ_HZ
Te6edf3PR_FREQ_DECAY Tff7b72= T79c0ff1Tff7b72/Te6edf3PR_MINFREQ_HZ

T8b949e# Maximum amount of ingress limited announces
T8b949e# to hold at any given time.
Te6edf3MAX_HELD_ANNOUNCES Tff7b72= T79c0ff256

T8b949e# How long a spawned interface will be
T8b949e# considered to be newly created. Two
T8b949e# hours by default.
Te6edf3IC_NEW_TIME Tff7b72= T79c0ff2Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3IC_BURST_FREQ_NEW Tff7b72= T79c0ff3
Te6edf3IC_BURST_FREQ Tff7b72= T79c0ff10
Te6edf3IC_PR_BURST_FREQ_NEW Tff7b72= T79c0ff3
Te6edf3IC_PR_BURST_FREQ Tff7b72= T79c0ff8
Te6edf3IC_BURST_HOLD Tff7b72= T79c0ff15
Te6edf3IC_BURST_PENALTY Tff7b72= T79c0ff15
Te6edf3IC_HELD_RELEASE_INTERVAL Tff7b72= T79c0ff5
Te6edf3IC_DEQUE_MIN_SAMPLE Tff7b72= T79c0ff2
Te6edf3IC_BURST_MIN_SAMPLES Tff7b72= T79c0ff6
Te6edf3EC_PR_FREQ Tff7b72= T79c0ff5
Te6edf3EGRESS_CONTROL Tff7b72= Tff7b72False

T8b949e# Default announce rate targets
Te6edf3DEFAULT_AR_TARGET Tff7b72= T79c0ff3600
Te6edf3DEFAULT_AR_PENALTY Tff7b72= T79c0ff0
Te6edf3DEFAULT_AR_GRACE Tff7b72= T79c0ff5

Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72False
Te6edf3FIXED_MTU Tff7b72= Tff7b72False

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffcreated Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff62500
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__hash Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffsupports_discovery Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdiscoverable Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflast_discovery_announce Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffbootstrap_only Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffrecursive_prs Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffannounces_from_internal Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffspawned_interfaces Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftunnel_id Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffingress_control Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffphy_keepalive Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffic_burst_active Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffic_burst_activated Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_active Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_activated Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffic_held_release Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffic_max_held_announces Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_max_held_announcesTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_burst_hold Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_burst_holdTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_burst_freq_new Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_burst_freq_newTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_burst_freq Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_burst_freqTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq_new Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_pr_burst_freq_newTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_pr_burst_freqTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_new_time Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_new_timeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_burst_penalty Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_burst_penaltyTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_held_release_interval Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ic_held_release_intervalTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffec_pr_freq Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ec_pr_freqTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffegress_control Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_egress_controlTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffheld_announces Tff7b72= Tb4b4b4{Tb4b4b4}

Tff7b72selfTff7b72.Td2a8ffia_freq_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3InterfaceTff7b72.Td2a8ffIA_FREQ_SAMPLESTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoa_freq_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3InterfaceTff7b72.Td2a8ffOA_FREQ_SAMPLESTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffip_freq_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3InterfaceTff7b72.Td2a8ffIA_FREQ_SAMPLESTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffop_freq_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3InterfaceTff7b72.Td2a8ffOA_FREQ_SAMPLESTb4b4b4)

Tff7b72def Td2a8ffget_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__hashTb4b4b4: Tff7b72selfTff7b72.Td2a8ff__hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__hash

T8b949e# This is a generic function for determining when an interface
T8b949e# should activate ingress limiting. Since this can vary for
T8b949e# different interface types, this function should be overwritten
T8b949e# in case a particular interface requires a different approach.
Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffingress_controlTb4b4b4:
Te6edf3freq_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq_new Tff7b72if Tff7b72selfTff7b72.Td2a8ffageTb4b4b4(Tb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffic_new_time Tff7b72else Tff7b72selfTff7b72.Td2a8ffic_burst_freq
Te6edf3ia_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffincoming_announce_frequencyTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffic_burst_activeTb4b4b4:
Tff7b72if Te6edf3ia_freq Tff7b72< Te6edf3freq_threshold Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffic_burst_activatedTff7b72+Tff7b72selfTff7b72.Td2a8ffic_burst_holdTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffIC_DEQUE_MIN_SAMPLETb4b4b4: Tff7b72selfTff7b72.Td2a8ffic_burst_active Tff7b72= Tff7b72False

Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3ia_freq Tff7b72> Te6edf3freq_thresholdTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffic_burst_active Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffic_burst_activated Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_held_release Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tff7b72selfTff7b72.Td2a8ffic_burst_penalty
Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffshould_ingress_limit_prTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffingress_controlTb4b4b4:
Te6edf3freq_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq_new Tff7b72if Tff7b72selfTff7b72.Td2a8ffageTb4b4b4(Tb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffic_new_time Tff7b72else Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq
Te6edf3ip_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffincoming_pr_frequencyTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffic_pr_burst_activeTb4b4b4:
Tff7b72if Te6edf3ip_freq Tff7b72< Te6edf3freq_threshold Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffic_pr_burst_activatedTff7b72+Tff7b72selfTff7b72.Td2a8ffic_burst_holdTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_active Tff7b72= Tff7b72False

Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3ip_freq Tff7b72> Te6edf3freq_thresholdTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_active Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffic_pr_burst_activated Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffshould_egress_limit_prTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffegress_controlTb4b4b4:
Te6edf3freq_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffec_pr_freq
Te6edf3op_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffoutgoing_pr_frequencyTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3op_freq Tff7b72> Te6edf3freq_thresholdTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffIC_BURST_MIN_SAMPLESTb4b4b4: Tff7b72return Tff7b72True
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffoptimise_mtuTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffAUTOCONFIGURE_MTUTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72>Tff7b72= T79c0ff1_000_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff524288
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff750_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff262144
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff400_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff131072
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff200_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff65536
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff100_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff32768
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff10_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff16384
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff5_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff8192
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff2_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff4096
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff1_000_000Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff2048
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72> T79c0ff62_500Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff1024
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Tff7b72None

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff hardware MTU set to Tffd700{Tff7b72selfTff7b72.Td2a8ffHW_MTUTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4)

Tff7b72def Td2a8ffageTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72selfTff7b72.Td2a8ffcreated

Tff7b72def Td2a8ffhold_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3announce_packetTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3announce_packetTff7b72.Td2a8ffhops Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATHFINDER_MTff7b72-T79c0ff1Tb4b4b4:
Tff7b72return
Tff7b72elif Te6edf3announce_packetTff7b72.Td2a8ffdestination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4[Te6edf3announce_packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3announce_packet
Tff7b72elif Tff7b72not Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_max_held_announcesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4[Te6edf3announce_packetTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3announce_packet

Tff7b72def Td2a8ffprocess_held_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffic_held_releaseTb4b4b4:
Te6edf3freq_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq_new Tff7b72if Tff7b72selfTff7b72.Td2a8ffageTb4b4b4(Tb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffic_new_time Tff7b72else Tff7b72selfTff7b72.Td2a8ffic_burst_freq
Te6edf3ia_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffincoming_announce_frequencyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3ia_freq Tff7b72< Te6edf3freq_thresholdTb4b4b4:
Te6edf3selected_announce_packet Tff7b72= Tff7b72None
Te6edf3min_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATHFINDER_M
Tff7b72for Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4:
Te6edf3announce_packet Tff7b72= Tff7b72selfTff7b72.Td2a8ffheld_announcesTb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3announce_packetTff7b72.Td2a8ffhops Tff7b72< Te6edf3min_hopsTb4b4b4:
Te6edf3min_hops Tff7b72= Te6edf3announce_packetTff7b72.Td2a8ffhops
Te6edf3selected_announce_packet Tff7b72= Te6edf3announce_packet

Tff7b72if Te6edf3selected_announce_packet Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleasing held announce packet Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3selected_announce_packetTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffic_held_release Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tff7b72selfTff7b72.Td2a8ffic_held_release_interval
Tff7b72selfTff7b72.Td2a8ffheld_announcesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3selected_announce_packetTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72def Td2a8ffreleaseTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3selected_announce_packetTff7b72.Td2a8ffrawTb4b4b4, Te6edf3selected_announce_packetTff7b72.Td2a8ffreceiving_interfaceTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3releaseTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while processing held announces for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffreceived_announceTb4b4b4(Te6edf3from_spawnedTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72def Td2a8ffsent_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffsent_announceTb4b4b4(Te6edf3from_spawnedTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72def Td2a8ffreceived_path_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffip_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffreceived_path_requestTb4b4b4(Te6edf3from_spawnedTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72def Td2a8ffsent_path_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffsent_path_requestTb4b4b4(Te6edf3from_spawnedTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72def Td2a8ffincoming_announce_frequencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3n Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3n Tff7b72> Tff7b72selfTff7b72.Td2a8ffIC_DEQUE_MIN_SAMPLETb4b4b4: Tff7b72return T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3oldest Tff7b72= Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3oldest
Tff7b72if Te6edf3span Tff7b72> Tff7b72selfTff7b72.Td2a8ffAR_FREQ_DECAYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3span Tff7b72<Tff7b72= T79c0ff0Tb4b4b4: Tff7b72return T79c0ff0
Te6edf3hz Tff7b72= Te6edf3n Tff7b72/ Te6edf3span
Tff7b72return Te6edf3hz

Tff7b72def Td2a8ffoutgoing_announce_frequencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3n Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4: Tff7b72return T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3oldest Tff7b72= Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3oldest
Tff7b72if Te6edf3span Tff7b72> Tff7b72selfTff7b72.Td2a8ffAR_FREQ_DECAYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3span Tff7b72<Tff7b72= T79c0ff0Tb4b4b4: Tff7b72return T79c0ff0
Te6edf3hz Tff7b72= Te6edf3n Tff7b72/ Te6edf3span
Tff7b72return Te6edf3hz

Tff7b72def Td2a8ffincoming_pr_frequencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3n Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffip_freq_dequeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3n Tff7b72> Tff7b72selfTff7b72.Td2a8ffIC_DEQUE_MIN_SAMPLETb4b4b4: Tff7b72return T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3oldest Tff7b72= Tff7b72selfTff7b72.Td2a8ffip_freq_dequeTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3oldest
Tff7b72if Te6edf3span Tff7b72> Tff7b72selfTff7b72.Td2a8ffPR_FREQ_DECAYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffip_freq_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3span Tff7b72<Tff7b72= T79c0ff0Tb4b4b4: Tff7b72return T79c0ff0
Te6edf3hz Tff7b72= Te6edf3n Tff7b72/ Te6edf3span
Tff7b72return Te6edf3hz

Tff7b72def Td2a8ffoutgoing_pr_frequencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3n Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4: Tff7b72return T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3oldest Tff7b72= Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3oldest
Tff7b72if Te6edf3span Tff7b72> Tff7b72selfTff7b72.Td2a8ffPR_FREQ_DECAYTb4b4b4: Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3span Tff7b72<Tff7b72= T79c0ff0Tb4b4b4: Tff7b72return T79c0ff0
Te6edf3hz Tff7b72= Te6edf3n Tff7b72/ Te6edf3span
Tff7b72return Te6edf3hz

Tff7b72def Td2a8ffprocess_announce_queueTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_cap Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffANNOUNCE_CAP

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3stale Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3a Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4:
Tff7b72if Te6edf3now Tff7b72> Te6edf3aTb4b4b4[Ta5d6ff"Ta5d6fftimeTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffQUEUED_ANNOUNCE_LIFETb4b4b4:
Te6edf3staleTff7b72.Td2a8ffappendTb4b4b4(Te6edf3aTb4b4b4)

Tff7b72for Te6edf3s Tff7b72in Te6edf3staleTb4b4b4:
Tff7b72if Te6edf3s Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_queueTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3sTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3min_hops Tff7b72= Tffa657minTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4)
Te6edf3entries Tff7b72= Tffa657listTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3min_hopsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4)Tb4b4b4)
Te6edf3entriesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fftimeTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3selected Tff7b72= Te6edf3entriesTb4b4b4[T79c0ff0Tb4b4b4]

Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3tx_time Tff7b72= Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3selectedTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72*T79c0ff8Tb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffbitrate
Te6edf3wait_time Tff7b72= Tb4b4b4(Te6edf3tx_time Tff7b72/ Tff7b72selfTff7b72.Td2a8ffannounce_capTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_allowed_at Tff7b72= Te6edf3now Tff7b72+ Te6edf3wait_time

Tff7b72selfTff7b72.Td2a8ffprocess_outgoingTb4b4b4(Te6edf3selectedTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsent_announceTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3selected Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_queueTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3selectedTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_queueTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3timer Tff7b72= Te6edf3threadingTff7b72.Td2a8ffTimerTb4b4b4(Te6edf3wait_timeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffprocess_announce_queueTb4b4b4)
Te6edf3timerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_queue Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while processing announce queue on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe announce queue for this interface has been cleared.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8fffinal_initTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass

Tf0883e@staticmethod
Tff7b72def Td2a8ffget_config_objTb4b4b4(Te6edf3config_inTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3config_inTb4b4b4) Tff7b72== Te6edf3ConfigObjTb4b4b4: Tff7b72return Te6edf3config_in
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72return Te6edf3ConfigObjTb4b4b4(Te6edf3config_inTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not parse supplied configuration data. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid configuration data suppliedTa5d6ff"Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────